#pragma once

#include <iostream>
#include <memory>
#include <string>
#include <unistd.h>

#include "Protocal.hpp"
#include "Socket.hpp"
#include "Com_ERR.hpp"

using namespace Socket_ns;

class TcpClient
{
public:
    TcpClient(std::string ip, uint16_t port)
        : _server_ip(ip), _server_port(port), _sock(std::make_shared<TcpSocket>())
    {
        // 断线重连
        int cnt = 5;
        while (cnt)
        {
            if (_sock->BuildClientSoket(_server_ip, _server_port))
            {
                break;
            }
            std::cout << "连接失败正在重连...., 重连剩余次数：" << --cnt << std::endl;
            sleep(1);
        }

        if (cnt == 0)
        {
            std::cout << "connect failed" << std::endl;
            exit(CONN_ERROR);
        }
    }

    ~TcpClient()
    {
    }

    /*单进程版*/
    // void Loop()
    // {
    //     while (true)
    //     {
    //         int x = 0, y = 0;
    //         char oper = '+';
    //         std::cout << "请输入 x, oper, y:> ";
    //         std::cin >> x >> oper >> y;

    //         auto req = Factory::BuildRequest();
    //         req->SetValue(x, y, oper);

    //         // 序列化
    //         std::string jsonstr;
    //         req->Serialize(&jsonstr);

    //         // 添加报头
    //         jsonstr = EnCode(jsonstr);
    //         // 发送给服务端
    //         _sock->Send(jsonstr);

    //         // 读取响应
    //         std::string packageStream;
    //         while (true)
    //         {
    //             ssize_t n = _sock->Recv(&packageStream);
    //             if (n <= 0)
    //                 break;

    //             // 提取有效载荷
    //             std::string package = DeCode(packageStream);
    //             if (package.empty())
    //                 continue;
              
    //             // 反序列化
    //             auto resp = Factory::BuildResponse();
    //             resp->Deserialize(package);
                
    //             resp->Print();
    //             break;
    //         }

    //         std::cout << "----------------------------------------" << std::endl;
    //     }
    //     _sock->Close();
    // }


void recvMsg(std::string)
    {
        while (true)
        {
            int x = 0, y = 0;
            char oper = '+';
            std::cout << "请输入 x, oper, y:> ";
            std::cin >> x >> oper >> y;

            auto req = Factory::BuildRequest();
            req->SetValue(x, y, oper);

            // 序列化
            std::string jsonstr;
            req->Serialize(&jsonstr);

            // 添加报头
            jsonstr = EnCode(jsonstr);
            // 发送给服务端
            _sock->Send(jsonstr);
            usleep(1000);
        }
        _sock->Close();
    }

    void sendMsg(std::string)
    {
        // 读取响应
        std::string packageStream;
        while (true)
        {
            ssize_t n = _sock->Recv(&packageStream);
            if (n <= 0)
                break;

            // 提取有效载荷
            std::string package = DeCode(packageStream);
            if (package.empty())
                continue;
            // std::cout << "package => " << package << std::endl;
            // 反序列化
            auto resp = Factory::BuildResponse();
            resp->Deserialize(package);
            // std::cout << resp->GetResult() << " " << resp->GetCode() << " " << resp->GetDesc() << std::endl;
            resp->Print();
            std::cout << "----------------------------------------" << std::endl;
        }
        _sock->Close();
    }

private:
    std::string _server_ip;// 服务端 ip
    uint16_t _server_port; // 服务端 port
    SockSPtr _sock; //  // 父类对象
};